#include "TypeCheckDispatcher.h"

using namespace std;
/* RESOLVE TYPES */
TypeMetaReference ITypeCheckDispatcher::ResolveType(OP operation, const TypeMetaReference &t1, const TypeMetaReference &t2) {
	static std::map<operation_identifier, ITypeCheckDispatcher*, operation_identifier> operations;
	if (operations.empty()) {
		ITypeCheckDispatcher *temp;

		operations[operation_identifier(ITypeCheckDispatcher::ConditionalOr, TypeMeta::Boolean, TypeMeta::Boolean)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::ConditionalOr, TypeMeta::Boolean, TypeMeta::Boolean>());
		operations[operation_identifier(ITypeCheckDispatcher::ConditionalAnd, TypeMeta::Boolean, TypeMeta::Boolean)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::ConditionalAnd, TypeMeta::Boolean, TypeMeta::Boolean>());
		operations[operation_identifier(ITypeCheckDispatcher::InclusiveOr, TypeMeta::Boolean, TypeMeta::Boolean)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::InclusiveOr, TypeMeta::Boolean, TypeMeta::Boolean>());
		operations[operation_identifier(ITypeCheckDispatcher::ExclusiveOr, TypeMeta::Boolean, TypeMeta::Boolean)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::ExclusiveOr, TypeMeta::Boolean, TypeMeta::Boolean>());
		operations[operation_identifier(ITypeCheckDispatcher::And, TypeMeta::Boolean, TypeMeta::Boolean)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::And, TypeMeta::Boolean, TypeMeta::Boolean>());

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::EqualTo, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Char, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Char, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Char, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Char, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Byte, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Byte, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Byte, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Byte, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Short, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Short, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Short, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Int, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Boolean, TypeMeta::Boolean)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::EqualTo, TypeMeta::Boolean, TypeMeta::Boolean>());

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::EqualTo, TypeMeta::Reference | TypeMeta::String, TypeMeta::Null>());
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Reference, TypeMeta::Null)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::String, TypeMeta::Null)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::EqualTo, TypeMeta::Null, TypeMeta::Reference | TypeMeta::String>());
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Null, TypeMeta::Reference)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Null, TypeMeta::String)] = temp;

		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Null, TypeMeta::Null)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::EqualTo, TypeMeta::Null, TypeMeta::Null>());

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::EqualTo, TypeMeta::Reference | TypeMeta::String, TypeMeta::Reference | TypeMeta::String>());
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Reference, TypeMeta::Reference)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::Reference, TypeMeta::String)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::String, TypeMeta::String)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::EqualTo, TypeMeta::String, TypeMeta::Reference)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::NotEqualTo, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Char, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Char, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Char, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Char, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Byte, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Byte, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Byte, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Byte, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Short, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Short, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Short, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Int, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Boolean, TypeMeta::Boolean)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::NotEqualTo, TypeMeta::Boolean, TypeMeta::Boolean>());

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::NotEqualTo, TypeMeta::Reference | TypeMeta::String, TypeMeta::Null>());
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Reference, TypeMeta::Null)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::String, TypeMeta::Null)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::NotEqualTo, TypeMeta::Null, TypeMeta::Reference | TypeMeta::String>());
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Null, TypeMeta::Reference)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Null, TypeMeta::String)] = temp;

		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Null, TypeMeta::Null)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::NotEqualTo, TypeMeta::Null, TypeMeta::Null>());

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::NotEqualTo, TypeMeta::Reference | TypeMeta::String, TypeMeta::Reference | TypeMeta::String>());
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Reference, TypeMeta::Reference)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::Reference, TypeMeta::String)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::String, TypeMeta::String)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::NotEqualTo, TypeMeta::String, TypeMeta::Reference)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::LessThan, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Char, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Char, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Char, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Char, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Byte, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Byte, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Byte, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Byte, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Short, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Short, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Short, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThan, TypeMeta::Int, TypeMeta::Int)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::GreaterThan, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Char, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Char, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Char, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Char, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Byte, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Byte, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Byte, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Byte, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Short, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Short, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Short, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThan, TypeMeta::Int, TypeMeta::Int)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Char, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Char, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Char, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Char, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Byte, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Byte, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Byte, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Byte, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Short, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Short, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Short, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::LessThanEqualTo, TypeMeta::Int, TypeMeta::Int)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Char, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Char, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Char, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Char, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Byte, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Byte, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Byte, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Byte, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Short, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Short, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Short, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::GreaterThanEqualTo, TypeMeta::Int, TypeMeta::Int)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::InstanceOf, TypeMeta::Reference | TypeMeta::String, TypeMeta::Reference | TypeMeta::String>());
		operations[operation_identifier(ITypeCheckDispatcher::InstanceOf, TypeMeta::Reference, TypeMeta::Reference)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::InstanceOf, TypeMeta::Reference, TypeMeta::String)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::InstanceOf, TypeMeta::String, TypeMeta::String)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::InstanceOf, TypeMeta::String, TypeMeta::Reference)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::InstanceOf, TypeMeta::Null, TypeMeta::Reference | TypeMeta::String>());
		operations[operation_identifier(ITypeCheckDispatcher::InstanceOf, TypeMeta::Null, TypeMeta::Reference)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::InstanceOf, TypeMeta::Null, TypeMeta::String)] = temp;

		operations[operation_identifier(ITypeCheckDispatcher::InstanceOf, TypeMeta::Array, TypeMeta::Reference)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::InstanceOf, TypeMeta::Array, TypeMeta::Reference>());
		operations[operation_identifier(ITypeCheckDispatcher::InstanceOf, TypeMeta::Reference, TypeMeta::Array)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::InstanceOf, TypeMeta::Reference, TypeMeta::Array>());
		operations[operation_identifier(ITypeCheckDispatcher::InstanceOf, TypeMeta::Array, TypeMeta::Array)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::InstanceOf, TypeMeta::Array, TypeMeta::Array>());

		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::String)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::String>());

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::Int)] = temp;

		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::Char)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::Char>());
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::Boolean)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::Boolean>());
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::Null)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::Null>());

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::Reference | TypeMeta::Array>());
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::Reference)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::String, TypeMeta::Array)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Addition, TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int, TypeMeta::String>());
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Byte, TypeMeta::String)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Short, TypeMeta::String)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Int, TypeMeta::String)] = temp;

		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Char, TypeMeta::String)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Addition, TypeMeta::Char, TypeMeta::String>());
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Boolean, TypeMeta::String)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Addition, TypeMeta::Boolean, TypeMeta::String>());
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Null, TypeMeta::String)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Addition, TypeMeta::Null, TypeMeta::String>());
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Reference, TypeMeta::String)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Addition, TypeMeta::Reference, TypeMeta::String>());

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Addition, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Char, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Char, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Char, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Char, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Byte, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Byte, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Byte, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Byte, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Short, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Short, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Short, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Addition, TypeMeta::Int, TypeMeta::Int)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Subtraction, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Char, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Char, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Char, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Char, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Byte, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Byte, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Byte, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Byte, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Short, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Short, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Short, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Subtraction, TypeMeta::Int, TypeMeta::Int)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Multiplication, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Char, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Char, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Char, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Char, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Byte, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Byte, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Byte, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Byte, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Short, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Short, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Short, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Multiplication, TypeMeta::Int, TypeMeta::Int)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Division, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Char, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Char, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Char, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Char, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Byte, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Byte, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Byte, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Byte, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Short, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Short, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Short, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Division, TypeMeta::Int, TypeMeta::Int)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Modulus, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Char, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Char, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Char, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Char, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Byte, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Byte, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Byte, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Byte, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Short, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Short, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Short, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Modulus, TypeMeta::Int, TypeMeta::Int)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Negation, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Char, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Char, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Char, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Char, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Byte, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Byte, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Byte, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Byte, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Short, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Short, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Short, TypeMeta::Int)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Negation, TypeMeta::Int, TypeMeta::Int)] = temp;

		operations[operation_identifier(ITypeCheckDispatcher::Complement, TypeMeta::Boolean, TypeMeta::Boolean)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Complement, TypeMeta::Boolean, TypeMeta::Boolean>());

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Casting, TypeMeta::Int, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Int, TypeMeta::Int)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Casting, TypeMeta::Short, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Short, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Short, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Short, TypeMeta::Int)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Casting, TypeMeta::Byte, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Byte, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Byte, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Byte, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Byte, TypeMeta::Int)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Casting, TypeMeta::Char, TypeMeta::Char | TypeMeta::Byte | TypeMeta::Short | TypeMeta::Int>());
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Char, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Char, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Char, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Char, TypeMeta::Int)] = temp;

		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Boolean, TypeMeta::Boolean)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Casting, TypeMeta::Boolean, TypeMeta::Boolean>());

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Casting, TypeMeta::Reference | TypeMeta::String, TypeMeta::Reference | TypeMeta::String>());
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Reference, TypeMeta::Reference)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Reference, TypeMeta::String)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::String, TypeMeta::String)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::String, TypeMeta::Reference)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Casting, TypeMeta::Array, TypeMeta::Reference | TypeMeta::String>());
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Array, TypeMeta::String)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Array, TypeMeta::Reference)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Casting, TypeMeta::Reference | TypeMeta::String, TypeMeta::Array>());
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Reference, TypeMeta::Array)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::String, TypeMeta::Array)] = temp;

		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Array, TypeMeta::Array)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Casting, TypeMeta::Array, TypeMeta::Array>());

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Casting, TypeMeta::Array | TypeMeta::Reference | TypeMeta::String, TypeMeta::Null>());
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Array, TypeMeta::Null)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::Reference, TypeMeta::Null)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Casting, TypeMeta::String, TypeMeta::Null)] = temp;

		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Int, TypeMeta::Int)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Assignment, TypeMeta::Int, TypeMeta::Int>());

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Assignment, TypeMeta::Int | TypeMeta::Short, TypeMeta::Short>());
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Int, TypeMeta::Short)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Short, TypeMeta::Short)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Assignment, TypeMeta::Int | TypeMeta::Short | TypeMeta::Byte, TypeMeta::Byte>());
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Int, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Short, TypeMeta::Byte)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Byte, TypeMeta::Byte)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Assignment, TypeMeta::Int | TypeMeta::Char, TypeMeta::Char>());
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Int, TypeMeta::Char)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Char, TypeMeta::Char)] = temp;

		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Boolean, TypeMeta::Boolean)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Assignment, TypeMeta::Boolean, TypeMeta::Boolean>());

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Assignment, TypeMeta::Reference | TypeMeta::String, TypeMeta::Reference | TypeMeta::String>());
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Reference, TypeMeta::Reference)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Reference, TypeMeta::String)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::String, TypeMeta::String)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::String, TypeMeta::Reference)] = temp;

		temp = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Assignment, TypeMeta::Reference | TypeMeta::String | TypeMeta::Array, TypeMeta::Null>());
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Reference, TypeMeta::Null)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::String, TypeMeta::Null)] = temp;
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Array, TypeMeta::Null)] = temp;

		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Reference, TypeMeta::Array)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Assignment, TypeMeta::Reference, TypeMeta::Array>());
		operations[operation_identifier(ITypeCheckDispatcher::Assignment, TypeMeta::Array, TypeMeta::Array)] = (ITypeCheckDispatcher*)(new TypeCheckDispatcher<ITypeCheckDispatcher::Assignment, TypeMeta::Array, TypeMeta::Array>());
	}

	std::map<operation_identifier, ITypeCheckDispatcher*, operation_identifier>::iterator dispatcher = operations.find(operation_identifier(operation, t1.category, t2.category));

	if (dispatcher != operations.end()) return dispatcher->second->op(t1, t2);
	else return TypeMetaReference();
}